/**
 * 用户、资源、角色绑定关系表。这里的角色，指的是role_name，并为角色单独定义规格。如果接入方，想对角色定义规格，可以使用acl_resource_type、acl_resource_detail构建角色模型，角色的名称就是【acl_resource_detail】表中的detail_name来进行指定。
 * 数据规则
 * （1）数据保护，校验business_line和access_key的合法性。
 * （2）唯一性：business_line、type_name、detail_name、user_num、role_name 五个属性组合逻辑唯一。
 * （3）冗余【acl_resource_type】的信息有：business_line、type_name、detail_name、resource_level、first_level、second_level、third_level、fourth_level、fifth_level。acl_user_resource_binding 会判断business_line、type_name、detail_name在【acl_resource_detail】是否存在。冗余设计的目的是在查询时，减少一次数据查询。
 * （4）first_level、second_level、third_level、fourth_level、fifth_level并不需要指定，是由business_line、type_name、detail_name唯一确认【acl_resource_detail】的信息，由其设置【绑定表】resource_level、first_level、second_level、third_level、fourth_level、fifth_level相关属性信息。即使指定信息，也不会依据first_level、second_level、third_level、fourth_level、fifth_level进行设置。
 *
 * @author luyl
 * @Time 2024-03-15 09:30:39
 */

package org.web.accesscontrollist.sdk.dto;

import java.util.Date;

import jakarta.validation.constraints.*;

import org.web.base.domain.InsertGroup;
import org.web.base.domain.UpdateGroup;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
@NotNull(message = "AclResourceUserBindingDTO 不能为空")
public class AclResourceUserBindingDTO {


    /**
     * 记录该条记录是否操作成功，enum={Y:成功;N:失败}
     */
    private Boolean executeSuccess;

    @Override
    public String toString() {
        return "AclResourceUserBindingDTO{" +
                "businessLine='" + getBusinessLine() + '\'' +
                ", typeName=" + typeName +
                ", detailName='" + detailName + '\'' +
                ", userNum='" + userNum + '\'' +
                ", roleName='" + roleName + '\'' +
                '}';
    }

    /**
     * 用户权限主键，acl_user_resource_binding表的主键。
     */
    @Null(message = "aclResourceUserBindingId must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private Integer aclResourceUserBindingId;

    /**
     * 资源定义外键，定义表外键，内部使用。
     */
    @Null(message = "aclResourceTypeId must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private Integer aclResourceTypeId;

    /**
     * 资源详情外键，资源信息唯一标识，内部使用。
     */
    @Null(message = "aclResourceDetailId must be null.做为入参时，必须为空，该属性作为出参返回。 ", groups = {UpdateGroup.class})
    private Integer aclResourceDetailId;

    /**
     * 业务线，其作用有两点，用于针对不同业务，进行资源隔离，其次提供附加的操作记录变更的权限管理。
     */
    @NotBlank(message = "businessLine can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 100, groups = {InsertGroup.class, UpdateGroup.class})
    private String businessLine;

    /**
     * 资源类型名称，用于资源定义，来源于资源定义。
     */
    @NotBlank(message = "typeName can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 200, groups = {InsertGroup.class, UpdateGroup.class})
    private String typeName;

    /**
     * 资源详情名称，业务名称、资源名称、资源详情名称三者逻辑唯一确认一条资源详情。
     */
    @NotBlank(message = "detailName can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 200, groups = {InsertGroup.class, UpdateGroup.class})
    private String detailName;

    /**
     * 角色名称，缺省角色的定义，可通过acl_detail定义角色名称，ACL并不建立其逻辑关系。不允许为空串。SDK定义默认值为【DEFAULT】，可以理解，资源与用户直接进行绑定，不需要引入角色的维度，但是仍要指定角色名称。
     */
    @NotBlank(message = "roleName can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    private String roleName = "DEFAULT";

    /**
     * 用户ID，绑定资源用户的唯一标识。
     */
    @NotBlank(message = "userNum can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    private String userNum;

    /**
     * 用户名称，绑定资源用户的名称。
     */
    @NotBlank(message = "userName can't be blank. ", groups = {InsertGroup.class})
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    private String userName;

    /**
     * 绑定状态，ON表示生效，OFF表示不生效。
     */
    @NotBlank(message = "bindingStatus can't be blank. ", groups = {InsertGroup.class})
    @Size(max = 255, groups = {InsertGroup.class, UpdateGroup.class})
    private String bindingStatus;

    /**
     * 资源等级，用树状结构描述资源。由【acl_resource_detail】business_line、type_name、detail_name唯一确认的记录信息，指定资源级别。最小值为0，最大值为5。
     */
    @Null(message = "resourceLevel must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private Integer resourceLevel;

    /**
     * 一级，描述一级资源内容。由【acl_resource_detail】business_line、type_name、detail_name唯一确认的记录信息，指定一级。
     */
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    @Null(message = "firstLevel must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private String firstLevel;

    /**
     * 二级，描述二级资源内容。由【acl_resource_detail】business_line、type_name、detail_name唯一确认的记录信息，指定二级。
     */
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    @Null(message = "secondLevel must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private String secondLevel;

    /**
     * 三级，描述三级资源内容。由【acl_resource_detail】business_line、type_name、detail_name唯一确认的记录信息，指定三级。
     */
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    @Null(message = "thirdLevel must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private String thirdLevel;

    /**
     * 四级，描述四级资源内容。由【acl_resource_detail】business_line、type_name、detail_name唯一确认的记录信息，指定四级。
     */
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    @Null(message = "fourthLevel must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private String fourthLevel;

    /**
     * 五级，描述五级资源内容。由【acl_resource_detail】business_line、type_name、detail_name唯一确认的记录信息，指定五级。
     */
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    @Null(message = "fifthLevel must be null. 做为入参时，必须为空，该属性作为出参返回。", groups = {UpdateGroup.class})
    private String fifthLevel;

    /**
     * 操作员ID，上次修改记录的操作人员工号，唯一标识操作人员。在同一批次内，都是相同的操作员ID。
     */
    @NotBlank(message = "operatorNum can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    private String operatorNum;

    /**
     * 操作员姓名，上次修改记录的操作人员姓名。在同一批次内，都是相同的操作员姓名。
     */
    @NotBlank(message = "operatorName can't be blank. ", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    private String operatorName;

    /**
     * 创建时间，用于记录创建时间，该记录，后面不会再次被修改。
     */
    @Null(message = "createTime can't be null.做为入参时，必须为空，该属性作为出参返回。 ", groups = {InsertGroup.class})
    private Date createTime;

    /**
     * 修改时间，用于记录修改时间，每次记录发生变更，都会变化。
     */
    private Date updateTime;

    /**
     * 是否删除，标记是否逻辑删除，enum={Y:删除;N:不删除}
     */
    @Pattern(regexp = "^([YN])$", message = "Y:删除;N:不删除", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 1, groups = {InsertGroup.class, UpdateGroup.class})
    private String isDelete;


}

